package cn.good.yan.m2;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 监听器 - 监听消息 - 消费者 - 死信
 * 演示1：需要启动生产者（MyMessageListener）启动该服务、消费者（Test3）模拟发送消息
 * 生产者发送消息，消费者，这边监听会得到消息
 * 演示1 ：正常请求  ，生产者 发送消息， 生产者-监听正常的队列，进行ack拒绝此消息，---- 该消息，会被推给死信队列中，被监听死信队列 所消费 - 处理
 * 演示2 （取消正常队列的监听） ，我们正常队列，设置存放消息只有20个，超过个数会溢出，进入 死信队列中，被监听死信队列 所消费 - 处理
 * 多出的5条消息，会被 被监听死信队列 所消费 - 处理
 * 演示3  （取消正常队列的监听），我们正常队列，设置消息超过10秒，没有被消费，，进入 死信队列中，被监听死信队列 所消费 - 处理
 * 该25 条数据，会被 被监听死信队列 所消费 - 处理  （与 演示2 同时配置，不会重复处理，） 总共25条 数据 进入 死信逻辑中
 * 延迟队列实现 方式1：
 * 生产者发送消息，到队列中，该队列配置消息超时时间，并没有消费者进行监听该队列（进行监听消费），超时进入死信队列，（监听死信队列）就是延迟队列的一种配置。
 *
 * @author shengren.yan
 * @create 2024-06-10
 */
@Component
@Slf4j
public class MySXListener3 {

    // 正常交换机
    public static final String EXCHANGE_NORMAL = "exchange.normal.video";
    // 正常路由键
    public static final String ROUTING_KEY_NORMAL = "routing.key.normal.video";
    // 正常队列
    public static final String QUEUE_NORMAL = "queue.normal.video";


    // 死信交换机
    public static final String EXCHANGE_DEAD_LETTER = "exchange.dead.letter.video";
    // 死信路由键
    public static final String ROUTING_KEY_DEAD_LETTER = "routing.key.dead.letter.video";
    // 死信队列
    public static final String QUEUE_DEAD_LETTER = "queue.dead.letter.video";


    // 监听正常队列 ， 在测试 演示2 和演示3 ，可以注释该监听注解
//    @RabbitListener(queues = {QUEUE_NORMAL})
    public void processMessageNormal(String dateString, Message message, Channel channel) throws IOException {
        // 监听正常队列，但是拒绝消息
        log.info("【正常】接受到消息：" + dateString);
//        log.info("1 消费者 - 收到消息，进行消息拒绝。");
        channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
    }

    // 监听死信队列
//    @RabbitListener(queues = {QUEUE_DEAD_LETTER})
    public void processMessageDead(String dataString, Message message, Channel channel) throws IOException {
        // 监听死信队列
        log.info("-------------");
        log.info("【死信】接受到消息 = " + dataString);
//        log.info("2 消费者 - 死信监听方法，接收到了死信消息。");
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }

}
